﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HROReporting.Infrastructure.CookieStorage;
using HROReporting.Services.Messaging.NFCDeviceService;
using HROReporting.Services.Interfaces;
using HROReporting.Services.Messaging.DocentIncheckingService;
using System.Text.RegularExpressions;
using HROReporting.Services.Messaging.PresentieIncheckingService;

namespace HROReporting.Controllers.Controllers
{
    public class IncheckController : BaseController
    {
        private IDocentIncheckingService _docentIncheckingService;
        private INFCDeviceService _nfcDeviceService;
        private IPresentieIncheckingService _presentieIncheckingService;

        public IncheckController(ICookieStorageService cookieStorageService, IDocentIncheckingService docentIncheckingService,
                              INFCDeviceService nfcDeviceService, IPresentieIncheckingService presentieIncheckingService)
            : base (cookieStorageService)
        {
            _docentIncheckingService = docentIncheckingService;
            _nfcDeviceService = nfcDeviceService;
            _presentieIncheckingService = presentieIncheckingService;
        }


        public void inchecken(string code, string nfcdevicserial)
        {
            
            /* 
            OUD stuk code, alleen ter referentie. Als het af is dan kan het verwijdert worden.
            
            String nfcDeviceFunctie = getNFCDeviceFunctie(nfcDeviceType);

            if (nfcDeviceFunctie.Equals("portalConfirmation"))
            {
                // Handelt de portal reservering af.

            }else
            {
                // Het is een incheck van een docent (waar die is en presentielijst bevestigen) of een student die incheckt voor een verplichte les. (presentielijst)

                if (Regex.IsMatch(studentOrTeacher, @"^[0-9]+$"))
                {
                    // Student, bevat alleen maar cijfers.
                }
                else
                {
                    // Docent, bevat meer dan alleen cijfers.
                    insertDocentInCheck(studentOrTeacher, nfcDeviceType);
                }
            }
             * */


            if (code != null && nfcdevicserial != null)
            {

                GetNFCDeviceByRequest nfcRequest = new GetNFCDeviceByRequest();
                nfcRequest.NFCDeviceSerial = nfcdevicserial;

                GetNFCDeviceByResponse nfcResponse = new GetNFCDeviceByResponse();
                nfcResponse = _nfcDeviceService.GetNFCDeviceByDeviceSerial(nfcRequest);

                string nfcDeviceFunctie = nfcResponse.NFCDevice.NFCDeviceFunctie;
                // De nfcdevicefunctie kan [Incheckingen] of [portalBevestiging] zijn.

                if (nfcDeviceFunctie.Equals("portalBevestiging"))
                {
                    // De incheckingen is een portal bevestiging. De reservering moet geverifieerd worden en er hoeft niet ingecheckt te worden. Geldt voor zowel student als docent.
                }
                else
                {
                    if (Regex.IsMatch(code, @"^[0-9]+$"))
                    {
                        // Het is een studentincheckingen voor verplichte les.

                        if (!_presentieIncheckingService.CheckIfStudentHasCheckidIn(code))
                        {
                            GetPresentielijstenBySerialRequest serialRequest = new GetPresentielijstenBySerialRequest();
                            serialRequest.serial = nfcResponse.NFCDevice.NFCDeviceSerial;

                            GetPresentielijstenBySerialResponse serialResponse = new GetPresentielijstenBySerialResponse();
                            serialResponse.Presentielijsten = _presentieIncheckingService.GetPresentielijstenBySerial(serialRequest).Presentielijsten;

                            CreatePresentieIncheckingRequest presentieRequest = new CreatePresentieIncheckingRequest();
                            presentieRequest.Studentnummer = code;
                            presentieRequest.Presentielijsten = serialResponse.Presentielijsten;

                            _presentieIncheckingService.CreateInchecking(presentieRequest);
                        }
                    }
                    else
                    {
                        // Het is een docentinchecking. Voor zijn locatie / aanwezigheid  alsmede bevestiging van presentielijst.

                        CreateDocentIncheckingRequest incheckRequest = new CreateDocentIncheckingRequest();
                        incheckRequest.DocentCode = code;
                        incheckRequest.NFCDeviceId = nfcResponse.NFCDevice.Id;

                        _docentIncheckingService.CreateDocentInchecking(incheckRequest);
                    }
                }
            }
        }
    }
}
